package dragon.modules.system.menu.action;

import dragon.core.exception.ExceptionHandler;
import dragon.core.util.GlobalParameter;
import dragon.core.util.Handler;
import dragon.modules.po.SysUser;

/**
 * Menu
 */
public class UserMenuHandler extends Handler {
	
	/**
	 * 获取用户菜单
	 * @throws ExceptionHandler
	 */
	public void request() throws ExceptionHandler{
		SysUser user = (SysUser)getSessionAttribute(GlobalParameter.User);
		output(user.getUserMenus());
	}
	
	
	

	/**
	 * 获取功能菜单
	 * 
	 * @throws ExceptionHandler
	 */
//	@SuppressWarnings("unchecked")
//	public void request() throws ExceptionHandler {
//		SysUser user = getUser();
//
//		// 查看特定用户的菜单(用户管理功能中，方便查询某一特定用户拥有的菜单功能)
//		boolean specifiedUser = false;
//		if (user.inGroup(Roles.Administrators)) {
//			String specified = getParameter("specified");
//			String uid = getParameter("uid");
//			if ("true".equals(specified) && StringUtils.isInteger(uid)) {
//				specifiedUser = true;
//				// 改变用户为指定的用户
//				user = new UserDaoImpl().getUser(Integer.parseInt(uid));
//			}
//		}
//
//		// 缓存中的菜单数据
//		LinkedHashMap<String, SysMenu2> cacheMenus = (LinkedHashMap<String, SysMenu2>) CacheManager.get(Caches.menus.name(), "tree");
//
//		// Step1 获取用户菜单
//		LinkedHashMap<String, SysMenu2> userMenus = new LinkedHashMap<String, SysMenu2>(cacheMenus.size());
//		Set<Entry<String, SysMenu2>> set = cacheMenus.entrySet();
//		Iterator<Entry<String, SysMenu2>> it = set.iterator();
//		try {
//			while (it.hasNext()) {
//				Entry<String, SysMenu2> entry = it.next();
//				userMenus.put(entry.getKey(), entry.getValue().clone());
//			}
//		} catch (CloneNotSupportedException e) {
//		}
//		it = null;
//		set = null;
//		cacheMenus = null;
//
//		if (!user.inGroup(Roles.Administrators)) {
//			// 普通用户，需要查询用户拥有的菜单数据
//			String sql = "select menu from " + SysRoleMenu.tableName + "  where kind='U' and tid=" + user.getId() + " union select menu from " + SysRoleMenu.tableName
//					+ "  where kind='R' and tid in(select usergroupid from " + SysUserGroupLink.tableName + " where userid=" + user.getId() + ")" + " union select menu from " + SysRoleMenu.tableName
//					+ "  where kind='O' and tid=" + user.getOrg();
//			List<Map<String, Object>> list = DML.query(sql);
//			String[] ids = new String[list.size()];
//			int i = 0;
//			for (Map<String, Object> map : list) {
//				ids[i++] = map.get("MENU").toString();
//			}
//			list = null;
//
//			// 标记菜单对用户可见
//			enable(userMenus, ids);
//			ids = null;
//		}
//
//		// Step2 特定格式输出
//		String html = drawMenus(userMenus, user, specifiedUser);
//		
//		
//		
//		output(html);
//
//		userMenus = null;
//		user = null;
//
//	}
//
//	/**
//	 * 将指定菜单对用户可见
//	 * 
//	 * @param userMenus
//	 *            用户菜单(包含了所有菜单)
//	 * @param menuIDS
//	 *            指定菜单ID
//	 * @throws ExceptionHandler
//	 */
//	@SuppressWarnings("unchecked")
//	private void enable(LinkedHashMap<String, SysMenu2> userMenus, String[] menuIDS) throws ExceptionHandler {
//		// 对于树形结构的菜单
//		// 当某一叶子节点的菜单对用户可见时，连同它的所有父节点都应该对用户可见
//		// 当某一菜单目录对用户可见时，连同它的所有子级菜单都应该对用户可见
//
//		// 从缓存中读取线性菜单数据
//		Map<String, SysMenu2> menus = (Map<String, SysMenu2>) CacheManager.get(Caches.menus.name(), "list");
//
//		SysMenu2 menu = null;
//		List<SysMenu2> parents = null;
//		SysMenu2 leaf = null;
//		for (String menuID : menuIDS) {
//			menu = menus.get(menuID);
//
//			// 非顶层节点，标记所有相关节点
//			// 一个3级菜单idpath：/1/2/3/
//			String idPath = menu.getIdpath();
//			// System.out.println(idPath);
//			idPath = idPath.substring(1, idPath.length() - 1);// 去除首尾的/--->1/2/3
//			parents = findAllMenus(userMenus, idPath);
//			if (parents.size() > 0) {
//				// 无论是菜单目录还是菜单实例，都需要将相关的节点设置为可见
//				for (SysMenu2 parent : parents) {
//					// System.out.println("mark parent:" + parent.getIdpath());
//					parent.setVisible(1);
//				}
//
//				leaf = parents.get(parents.size() - 1);
//				if (leaf.getKind().equals("1")) {
//					// 如果是目录，需要设置其下的所有子节点都可见
//					enableSubMenus(leaf);
//				}
//
//			}
//		}
//		leaf = null;
//		menu = null;
//		parents = null;
//
//	}
//
//	/**
//	 * 查找一个菜单的所有相关菜单(包含其自己)
//	 * 
//	 * @param userMenus
//	 *            用户菜单
//	 * @param idPath
//	 *            菜单idpath
//	 * @return
//	 */
//	private List<SysMenu2> findAllMenus(LinkedHashMap<String, SysMenu2> userMenus, String idPath) {
//		List<SysMenu2> list = new ArrayList<SysMenu2>();
//		String[] ids = idPath.split("/");
//		if (ids.length > 1) {
//			// 非顶层菜单，需要从菜单的children中查找
//			String parentIDPath = idPath.substring(0, idPath.lastIndexOf("/"));
//			List<SysMenu2> parents = findAllMenus(userMenus, parentIDPath);
//			if (parents.size() > 0) {
//				list.addAll(parents);
//				SysMenu2 parent = parents.get(parents.size() - 1);
//				int currentID = Integer.parseInt(idPath.substring(idPath.lastIndexOf("/") + 1));
//				for (SysMenu2 subMenu : parent.getChildren()) {
//					if (subMenu.getId() == currentID) {
//						list.add(subMenu);
//						break;
//					}
//				}
//				parent = null;
//			}
//			parents = null;
//		} else {
//			// 顶层菜单直接从缓存中获取
//			list.add(userMenus.get(idPath));
//		}
//		return list;
//	}
//
//	/**
//	 * 将指定菜单下的所有子级菜单对用户可见
//	 * 
//	 * @param menu
//	 *            指定菜单
//	 */
//	private void enableSubMenus(SysMenu2 menu) {
//		List<SysMenu2> children = menu.getChildren();
//		if (children != null) {
//			for (SysMenu2 subMenu : children) {
//				// System.out.println("mark child:" + subMenu.getIdpath());
//				subMenu.setVisible(1);
//				enableSubMenus(subMenu);
//			}
//		}
//	}
//
//	/**
//	 * 绘制菜单
//	 * 
//	 * @param menus
//	 *            菜单
//	 * @param user
//	 *            当前用户
//	 * @param specifiedUser
//	 *            是否指定了用户
//	 * @return
//	 * @throws ExceptionHandler
//	 */
//	private String drawMenus(LinkedHashMap<String, SysMenu2> menus, SysUser user, boolean specifiedUser) throws ExceptionHandler {
//		StringBuilder html = new StringBuilder();
//
//		Set<Entry<String, SysMenu2>> set = menus.entrySet();
//		Iterator<Entry<String, SysMenu2>> it = set.iterator();
//		while (it.hasNext()) {
//			Entry<String, SysMenu2> entry = it.next();
//			SysMenu2 menu = entry.getValue();
//			if (!user.inGroup(Roles.Administrators) && menu.getVisible() == 0 && !specifiedUser) {
//				continue;// 普通用户，只能绘制可见菜单
//			}
//			html.append("<div title=\"").append(menu.getName()).append(specifiedUser ? (!user.inGroup(Roles.Administrators) && menu.getVisible() == 0 ? "×" : "√") : "").append("\">\n");
//			// 处理子数据
//			if (menu.getChildren() != null && menu.getChildren().size() > 0) {
//				html.append(drawSubMenus(menu.getChildren(), user, specifiedUser));
//			}
//			html.append("</div>\n");
//
//			menu = null;
//			entry = null;
//		}
//		it = null;
//		set = null;
//
//		return html.toString();
//	}
//
//	/**
//	 * 绘制子菜单
//	 * 
//	 * @param children
//	 *            子级菜单
//	 * @param user
//	 *            当前用户
//	 * @param specifiedUser
//	 *            是否指定了用户
//	 * @return
//	 * @throws ExceptionHandler
//	 */
//	private String drawSubMenus(List<SysMenu2> children, SysUser user, boolean specifiedUser) throws ExceptionHandler {
//		StringBuilder html = new StringBuilder();
//		for (SysMenu2 menu : children) {
//			if (!user.inGroup(Roles.Administrators) && menu.getVisible() == 0 && !specifiedUser) {
//				continue;// 普通用户，只能绘制可见菜单
//			}
//			if ("0".equals(menu.getKind())) {
//				if (menu.getDepth() == 2) {
//					// 二级菜单实例
//					html.append("<div class=\"nochildpart\"  onclick=\"openTab('").append(menu.getName()).append("','").append(getContextPath()).append("").append(menu.getUrl()).append("');\">");
//					html.append("<div class=\"title\">");
//					html.append("<div class=\"titlelf\"></div>");
//					html.append("<div class=\"titlename\">").append(menu.getName()).append(specifiedUser ? (!user.inGroup(Roles.Administrators) && menu.getVisible() == 0 ? "×" : "√") : "")
//							.append("</div>");
//					html.append("<div class=\"titlert\"></div>");
//					html.append("</div></div>");
//				} else if (menu.getDepth() == 3) {
//					// 3级菜单实例
//					html.append("<div class=\"list\" onclick=\"openTab('").append(menu.getName()).append("','").append(getContextPath()).append("").append(menu.getUrl()).append("');\">");
//					html.append("<div  class=\"img\"><img src=\"").append(getContextPath()).append("").append(StringUtils.clear(menu.getIcon(), "/img/menu/default.gif")).append("\"></div>");
//					html.append("<div class=\"listname\">").append(menu.getName()).append(specifiedUser ? (!user.inGroup(Roles.Administrators) && menu.getVisible() == 0 ? "×" : "√") : "")
//							.append("</div>");
//					html.append("</div>");
//				}
//			} else {
//				// 菜单目录
//				html.append("<div class=\"part\">");
//				html.append("<div class=\"title\">");
//				html.append("<div class=\"titlelf\"></div>");
//				html.append("<div class=\"titlename\">").append(menu.getName()).append(specifiedUser ? (!user.inGroup(Roles.Administrators) && menu.getVisible() == 0 ? "×" : "√") : "")
//						.append("</div>");
//				html.append("<div class=\"titlert\"></div>");
//				html.append("</div>");
//				html.append("<div class=\"content\">");
//				if (menu.getChildren() != null && menu.getChildren().size() > 0) {
//					html.append(drawSubMenus(menu.getChildren(), user, specifiedUser));
//				}
//				html.append("</div>");
//				html.append("<div class=\"partfoot\">");
//				html.append("<div class=\"left\"></div>");
//				html.append("<div class=\"right\"></div>");
//				html.append("</div>");
//				html.append("</div>");
//			}
//		}
//		return html.toString();
//	}

}